package cn.ava.pet.service.impl;

import cn.ava.basic.service.impl.BaseServiceImpl;
import cn.ava.pet.domain.PetType;
import cn.ava.pet.mapper.PetTypeMapper;
import cn.ava.pet.service.IPetTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ava
 * @since 2022-07-16
 */
@Service
// 开启事务 只读属性和支持事务
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
public class PetTypeServiceImpl extends BaseServiceImpl<PetType> implements IPetTypeService {

    @Autowired
    private PetTypeMapper petTypeMapper;

    
    /**
     * @Title: add
     * @Description: 添加上级部门
     * @Author: Avavaava
     * @Version: 23.53
     * @Date: 2022/7/26 16:49
     * @param:
     * @return:
     */
    @Override
    @Transactional
    public void add(PetType petType) {
        petTypeMapper.add(petType);
        // 调用update方法设置上级部门
        this.update(petType);
    }

    @Override
    @Transactional
    public void update(PetType petType) {
        // 创建一个空字符串
        String dirPath = "";
        // 判断上级部门是否为空
        if (petType.getParent().getId() == null) {
            // 如果为空,那它自己就是顶级部门,拼接上自己的id即可
            dirPath = "/" + petType.getId();
        }else {
            // 如果不是null则有上级部门,先通过上级部门id查询到上级部门对象
            PetType parent = petTypeMapper.getById(petType.getParent().getId());
            // 再拼接上父级部门的dirPath和自己的id
            dirPath = parent.getDirPath() + "/" + petType.getId();
        }
        // 最后设置进dirPath中
        petType.setDirPath(dirPath);
        petTypeMapper.update(petType);
    }

    /**
     * @Title: getTree
     * @Description: 获取宠物树数据
     * @Author: Avavaava
     * @Version: 23.53
     * @Date: 2022/7/16 17:18
     * @param:
     * @return:
     */
    @Override
    public List<PetType> getTree() {
        // 先查询出来所有数据
        List<PetType> petTypeAll = petTypeMapper.loadAll();
        // 创建一个空集合,用于放树数据
        ArrayList<PetType> petTypes = new ArrayList<>();
        // 把所有数据转换为map,减少二次循环
        Map<Long, PetType> petTypeMap = petTypeAll.stream().collect(Collectors.toMap(PetType::getId, param -> param));
        // 循环取出所有数据
        for (PetType first : petTypeAll) {
            // 判断是否有父级id
            if (first.getPid() == null){
                // 如果没有,那么本身就是父级,直接放入空集合中
                petTypes.add(first);
            }else {
                // 如果没有上级,那么一定是子级,根据父级id拿出子级数据
                PetType children = petTypeMap.get(first.getPid());
                if (children != null) { // 判断不为空
                    // 把子级数据放入children集合中
                    children.getChildren().add(first);
                }
            }
        }
        // 返回数据
        return petTypes;
    }


}
